#include <iostream>
#include <cstdio>
#include <stack>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

typedef set<int> Set;//set
map<Set,int> IDCache;//
vector<Set> SetCache;
stack<int> s;

#define ALL(x)	x.begin(),x.end()
#define INS(x)	inserter(x,x.begin())

int ID(Set x)
{
	if(IDCache.count(x))	return IDCache[x];
	SetCache.push_back(x);
	IDCache[x] = SetCache.size()-1;
	return IDCache[x];
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		string op;
		cin >> op;
		if(op[0] == 'P')	s.push(ID(Set()));
		else if(op[0] == 'D')	s.push(s.top());
		else {
			Set x1 = SetCache[s.top()];
			s.pop();
			Set x2 = SetCache[s.top()];
			s.pop();
			Set x;
			if(op[0] == 'U') set_union(ALL(x1),ALL(x2),INS(x));
			if(op[0] == 'I') set_intersection(ALL(x1),ALL(x2),INS(x));
			if(op[0] == 'A') {
				x = x2;
				x.insert(ID(x1));
			}
			s.push(ID(x));
		}
		cout << SetCache[s.top()].size() << endl;
	}

	return 0;
}

